package projetDames.jeu;

import java.util.ArrayList;

import projetDames.composant.Pointp;

public class Noeuds {
	/** Coordonnées de la pièce que l'on veut deplacer */
	private Pointp pSource;
	/** Destination de la pièce que l'on veut deplacer */
	private Pointp pDestination;
	/** Poids du noeuds/feuille */
	private int poids;
	/** Liste des fils du noeuds */
	private ArrayList<Noeuds> listFils;

	/**
	 * Constructeur, reçoit les paramètres qui sont affectés en variables de
	 * classe. Instancie la variable de classe listFils Instancie la variable de
	 * classe poids à une valeur négative signifiant un poids null
	 * 
	 * @param pSource
	 *            coordonnées de la pièce que l'on veut deplacer
	 * @param pDestination
	 *            destination de la pièce que l'on veut deplacer
	 */
	public Noeuds(Pointp pSource, Pointp pDestination) {
		this.pSource = pSource;
		this.pDestination = pDestination;
		this.listFils = new ArrayList<Noeuds>();
		this.poids = -1;
	}

	/**
	 * Constructeur, reçoit les paramètres qui sont affectés en variables de
	 * classe. Instancie la variable de classe listFils
	 * 
	 * @param pSource
	 *            coordonnées de la pièce que l'on veut deplacer
	 * @param pDestination
	 *            destination de la pièce que l'on veut deplacer
	 */
	public Noeuds(Pointp pSource, Pointp pDestination, int p) {
		this.pSource = pSource;
		this.pDestination = pDestination;
		this.listFils = new ArrayList<Noeuds>();
		this.poids = p;
	}

	/**
	 * Getter de la variable de classe pSource
	 * 
	 * @return la variable de classe Pointp pSource
	 */
	public Pointp getSource() {
		return this.pSource;
	}

	/**
	 * Getter de la variable de classe pDestination
	 * 
	 * @return la variable de classe Pointp pDestination
	 */
	public Pointp getDestination() {
		return this.pDestination;
	}

	/**
	 * Getter de la variable de classe poids
	 * 
	 * @return la variable de classe int poids
	 */
	public int getPoids() {
		return this.poids;
	}

	/**
	 * Setter de la variable de classe poids
	 * 
	 * @param nb
	 *            entier, nouveau podis de la variable de classe poids
	 */
	public void setPoids(int nb) {
		this.poids = nb;
	}

	/**
	 * Getter de la variable de classe listFils
	 * 
	 * @return la variable de classe ArrayList<Noeuds> listFils
	 */
	public ArrayList<Noeuds> getListFils() {
		return this.listFils;
	}

	/**
	 * Permet de retourner le fils du noeuds courant à l'indice i envoyé en
	 * paramètre
	 * 
	 * @param i
	 *            indice de la liste
	 * @return un Noeuds fils a l'indice i si i est dans les bornes de listFils,
	 *         un Noeuds initialisé avec Pointp négatifs si i hors bornes
	 */
	public Noeuds getFils(int i) {
		if (i < listFils.size()) {
			return listFils.get(i);
		} else {
			System.out
					.println("ERROR:Noeuds.getFils(): indice i hors bornes, Noeuds non utilisable retourné (cf spec)");
			return new Noeuds(new Pointp(-1, -1), new Pointp(-1, -1));
		}
	}

	/**
	 * Permet d'ajouter un fils au noeuds courant
	 * 
	 * @param pSource
	 *            coordonnées de la pièce que l'on veut deplacer
	 * @param pDestination
	 *            destination de la pièce que l'on veut deplacer
	 */
	public void ajouteFils(Pointp pSource, Pointp pDestination) {
		listFils.add(new Noeuds(pSource, pDestination));
	}

	/**
	 * Permet d'ajouter un fils au noeuds courant avec son poids
	 * 
	 * @param pSource
	 *            pSource coordonnées de la pièce que l'on veut deplacer
	 * @param pDestination
	 *            pDestination destination de la pièce que l'on veut deplacer
	 * @param nb
	 *            poids du noeuds à ajouter
	 */
	public void ajouteFils(Pointp pSource, Pointp pDestination, int nb) {
		listFils.add(new Noeuds(pSource, pDestination, nb));
	}

	/**
	 * Permet de supprimer le fils du noeuds courant à l'indice i
	 * 
	 * @param i
	 *            indice du fils que l'on veut supprimer
	 */
	public void supprimeFils(int i) {
		if (i < listFils.size()) {
			listFils.remove(i);
		} else {
			System.out
					.println("ERROR:Noeuds.supprimeFils(): indice i hors bornes");
		}
	}

	/**
	 * Permet de savoir si le noeuds est une feuille (n'as pas de fils) ou non
	 * 
	 * @return vrai si le noeuds est une feuille, faux sinon
	 */
	public boolean estUneFeuille() {
		return listFils.isEmpty();
	}

	/**
	 * Permet de savoir si l'indice envoyé en paramètre est dans les bornes de
	 * la liste variable de classe listFils
	 * 
	 * @param i
	 *            indice
	 * @return vrai si i est dans les bornes de listFils, faux sinon
	 */
	public boolean indiceDansBornes(int i) {
		return (i >= 0 && i < listFils.size());
	}

	public void afficheNoeuds() {
		System.out.println("Source: " + pSource + "\n" + "Destination: "
				+ pDestination + "\n" + "Poids: " + poids);
	}

}
